define(['angularAMD','moment'], function (angularAMD,moment) {
    angularAMD.service('Andon00Service', ['$rootScope', '$filter', '$translate', 'config', 'MMWService', '$mdDialog', '$calculater', '$timeout',
        function($rootScope, $filter, $translate, config, $MMWService, $mdDialog, $calculater, $timeout){
            /* 
                slightBtnItem: 當前點擊的安燈按鈕資訊 (Object)
                machine_no: 當前點擊的設備編號 (string)
                callback: 刷新安燈按鈕 (function)
            */
            this.init = function(slightBtnItem, machine_no, callback){
                function openDialog() {
                    $mdDialog.dialog(
                        'module/moduleMSG/program/Andon00/Andon00.html',
                        function(dialog){
                            return {
                                css_url:'module/moduleMSG/program/Andon00/Andon00.css',
                                AndonItem: {
                                    machine_no: machine_no, // 設備編號
                                    area_no: '', // 區域編號
                                    lot_no: '', // 生產批號
                                    op_no: '', // 作業站編號
                                    slight_reason_no: '', // 安燈原因
                                    slight_reason_name: '', // 安燈原因
                                    grade: '3', // 緊急程度 -> 預設為 3: 緊急狀態
                                    gradename: $filter('translate')('Andon00.gradeList.three'), // 緊急程度名稱 -> 預設為 3: 緊急狀態
                                    materials_no: '', // 物料編號
                                    linkProgram: '', // 鏈結對象
                                    linkProgramName: '', // 鏈結對象名稱
                                    description: '' // 描述
                                },
                                machine_production_info_detail: [], // 今日生產任務的資料
                                machine_materials_detail: [], // 上機物料的資料
                                init: function() { // 初始化
                                    $MMWService.sendToServer({
                                        uri : 'ServicesSTD.Module_EQP.machine_working_info_get',
                                        content : {
                                            machine_no: dialog.AndonItem.machine_no,
                                            data_type : '1011'
                                        },
                                        success : function(data){
                                            dialog.getAreaNo(); // 取得區域編號

                                            // 安燈邏輯 1.2 會使用到今日生產任務和上機物料的資料，所以需要重新呼叫 machine_working_info_get 服務
                                            dialog.machine_production_info_detail = data.machine_production_info_detail;         
                                            dialog.machine_materials_detail = data.machine_materials_detail;         
                                        }
                                    });
                                },
                                back: function() {
                                    dialog.hide();
                                },
                                getAreaNo: function() { // 取得區域編號
                                    $MMWService.pageNumberInfoGet({
                                        page_mode : 'andon_area_no_get',
                                        query_condition_info:[
                                            {column_name: 'EQUIPMENTNO', query_mode: '0', value: dialog.AndonItem.machine_no, merge_condition_model: 'AND'}
                                        ]
                                    }, function(itemList){
                                        if(itemList && itemList.length > 0) {
                                            dialog.AndonItem.area_no = itemList[0].areano; // 區域編號
                                        } else {
                                            $rootScope.showAlert($filter('translate')('Andon00.msg.no_areaNo')); // 查無區域編號！
                                        }
                                    });
                                },
                                getLotNo: function() { // 取得生產批號
                                    $rootScope.showQueryList({
                                        key:'plot_no',
                                        header : [
                                            {label: $filter('translate')('Andon00.queryList.lot_no'), code:'plot_no'}, // 生產批號
                                            {label: $filter('translate')('common.queryList.op_c'), code:'op_no'} // 作業站編號
                                        ],
                                        query: function(conditions, feedback){
                                            if(!dialog.AndonItem.op_no){
                                                feedback(dialog.machine_production_info_detail);
                                            } else {
                                                // 如果已經有選擇作業站編號時，則過濾只顯示當前作業站編號的生產批號即可
                                                feedback($filter('filter')(dialog.machine_production_info_detail, { op_no: dialog.AndonItem.op_no }));
                                            }
                                        },
                                        selectCode: dialog.AndonItem.lot_no,
                                        confirm: function(selectItem, dialogType){
                                            dialog.AndonItem.lot_no = selectItem.plot_no; // 生產批號
                                            dialog.AndonItem.op_no = selectItem.op_no; // 作業站編號
                                            dialogType.hide();
                                        }
                                    });
                                },
                                getOpNo: function() { // 取得作業站編號
                                    $rootScope.showQueryList({
                                        key:'op_no',
                                        header : [
                                            {label: $filter('translate')('common.queryList.op_c'), code:'op_no'}, // 作業站編號
                                            {label: $filter('translate')('common.queryList.op_n'), code:'op_name'} // 作業站名稱
                                        ],
                                        query: function(conditions, feedback){
                                            // 刪除重複的數據
                                            function dedup(arr) {
                                                var hashTable = {};
                            
                                                return arr.filter(function (item) {
                                                    var key = JSON.stringify(item.op_no),
                                                        match = Boolean(hashTable[key]);

                                                    return (match ? false : hashTable[key] = true);
                                                });
                                            }

                                            var opNoList = []; // 重組作業站編號數組
                                            if(dialog.machine_production_info_detail && dialog.machine_production_info_detail.length > 0) {
                                                dialog.machine_production_info_detail.forEach(function(item) {
                                                    opNoList.push({
                                                        op_no: item.op_no,
                                                        op_name: item.op_name
                                                    });
                                                });
                                            }

                                            var temp = dedup(opNoList);
                                            feedback(temp);
                                        },
                                        selectCode: dialog.AndonItem.op_no,
                                        confirm: function(selectItem, dialogType){
                                            dialog.AndonItem.op_no = selectItem.op_no; // 作業站編號
                                            dialog.AndonItem.lot_no = ''; // 重新選取作業站編號時，生產批號需清空
                                            dialogType.hide();
                                        }
                                    });
                                },
                                getSlightReasonNo: function() { // 取得安燈原因
                                    $rootScope.showQueryList({
                                        key:'slightreasonno',
                                        header : [
                                            {label: $filter('translate')('Andon00.queryList.slight_reason_no'), code:'slightreasonno'}, // 安燈原因編號
                                            { label: $filter('translate')('Andon00.queryList.slight_reason_name'), code:'reasonname'} // 安燈原因名稱
                                        ],
                                        query: function(conditions, feedback){
                                            $MMWService.pageNumberInfoGet({
                                                page_mode : 'andon_reason_no_get',
                                                query_condition_info:[
                                                    {column_name: 'SLightTypeNo', query_mode: '0', value: slightBtnItem.slight_type_no, merge_condition_model: 'AND'}
                                                ]
                                            }, function(itemList){
                                                if(itemList && itemList.length > 0) {
                                                    feedback(itemList);
                                                } else {
                                                    $rootScope.showAlert($filter('translate')('common.msg.no_data'));
                                                }
                                            });
                                        },
                                        selectCode: dialog.AndonItem.slight_reason_no,
                                        confirm: function(selectItem, dialogType){
                                            dialog.AndonItem.slight_reason_no = selectItem.slightreasonno; // 安燈原因編號
                                            dialog.AndonItem.slight_reason_name = selectItem.reasonname;
                                            dialogType.hide();
                                        }
                                    });
                                },
                                getGrade: function() { // 取得緊急程度
                                    $rootScope.showQueryList({
                                        key:'grade',
                                        header : [
                                            {label: $filter('translate')('Andon00.queryList.grade'), code:'grade'}, // 緊急程度
                                            {label: $filter('translate')('Andon00.queryList.grade_name'), code:'gradename'} // 緊急程度名稱
                                        ],
                                        query: function(conditions, feedback){
                                            // 寫死緊急程度 -> 1: 普通 ; 2: 中等; 3: 緊急
                                            feedback([
                                                {grade: '1', gradename: $filter('translate')('Andon00.gradeList.one')},
                                                {grade: '2', gradename: $filter('translate')('Andon00.gradeList.two')},
                                                {grade: '3', gradename: $filter('translate')('Andon00.gradeList.three')}
                                            ])
                                        },
                                        selectCode: dialog.AndonItem.grade,
                                        confirm: function(selectItem, dialogType){
                                            dialog.AndonItem.grade = selectItem.grade; // 緊急程度
                                            dialog.AndonItem.gradename = selectItem.gradename; // 緊急程度名稱
                                            dialogType.hide();
                                        }
                                    });
                                },
                                getMaterialsNo: function() { // 取得物料編號
                                    $rootScope.showQueryList({
                                        key:'materials_no',
                                        header : [
                                            {label: $filter('translate')('Andon00.queryList.materials_no'), code:'materials_no'}, // 物料編號
                                            {label: $filter('translate')('Andon00.queryList.materials_name'), code:'materials_name'} // 物料名稱
                                        ],
                                        query: function(conditions, feedback){
                                            feedback(dialog.machine_materials_detail)
                                        },
                                        selectCode: dialog.AndonItem.materials_no,
                                        confirm: function(selectItem, dialogType){
                                            //console.log(selectItem);
                                            dialog.AndonItem.materials_no = selectItem.materials_no; // 物料編號
                                            //console.log(dialog.AndonItem.materials_no);
                                            dialogType.hide();
                                        }
                                    });
                                },
                                getLinkProgram: function() { // 取得鏈結對象 → 目前 SA 還沒規劃此功能，所以畫面先隱藏起來
                                    $rootScope.showTreeList({
                                        list : GetPrograms(),
                                        confirm : function(item, subItem, dialogType){
                                            dialog.AndonItem.linkProgram = subItem.code;
                                            dialog.AndonItem.linkProgramName = subItem.label;
                                            dialogType.hide();
                                        }
                                    });
                                },
                                confirm: function() {
                                    var eqp_status_list = [{
                                        equipment_no: dialog.AndonItem.machine_no, 		        // 設備編號	    (必須)
                                        slight_type_no: slightBtnItem.slight_type_no,		    // 安燈分類狀態 (必須)
                                        slight_reason_no: dialog.AndonItem.slight_reason_no,	// 安燈原因編號	(必須)
                                        grade: dialog.AndonItem.grade,					        // 緊急程度	    (必須)
                                        lot_no: dialog.AndonItem.lot_no,		                // 生產批號
                                        op_no: dialog.AndonItem.op_no,					        // 作業站
                                        material_no: dialog.AndonItem.materials_no,			    // 物料編號
                                        description: dialog.AndonItem.description               // 描述
                                    }];
                                    // 安燈寫入
                                    $MMWService.sendToServer({
                                        uri : 'ServicesSTD.Module_MSG.andon_eqp_status_process',
                                        content : {
                                            slight_status: slightBtnItem.slight_status,
                                            write_info : slightBtnItem.write_info,
                                            write_start: slightBtnItem.write_start,
                                            receive_project: slightBtnItem.receive_project,
                                            //20210423 Modify by德義家興for#78800: [标准][安灯/讯息][DEV]安灯与设备稼动联动机制
                                            change_eqp_status :slightBtnItem.change_eqp_status,
                                            eqp_status: slightBtnItem.eqp_status,
                                            // 20220621 add by zhuyc0412 for#0100246: [3.4.1patch][安灯]安灯模块相关优化建议及相关议题搬迁
                                            eqp_process_status: slightBtnItem.eqp_process_status,//0-7对应安灯后设备将要修改成的状态
                                            eqp_status_back:slightBtnItem.eqp_status_back,
                                            eqp_status_list: eqp_status_list
                                        },
                                        success : function(data){
                                            $rootScope.showToast($filter('translate')('common.msg.success'));
                                            if(callback)
                                                callback();
                                            //20210423 Modify by德義家興for#78800: [标准][安灯/讯息][DEV]安灯与设备稼动联动机制
                                            dialog.hide();
                                        }
                                    });

                                }
                            };
                        }
                    );
                }

                openDialog();

                // 取得鏈結對象
                function GetPrograms(){
                    var programs = [];
                    config.menu.forEach(function(menuItem){
                        if(menuItem.childs && menuItem.childs.length>0){
                            var module = {label:$filter('translate')(menuItem.title).replace('<br>', ''), code: menuItem.name, subItemList:[]};
                            menuItem.childs.forEach(function(childItem){
                                if(!childItem.panel && childItem.childs && childItem.childs.length>0){
                                    childItem.childs.forEach(function(subChildItem){
                                        module.subItemList.push({label:$filter('translate')(subChildItem.title).replace('<br>', ''), code:subChildItem.name});
                                    });
                                } else if(childItem.panel == true){
                                    module.subItemList.push({label:$filter('translate')(childItem.title).replace('<br>', ''), code:childItem.default});
                                } else {
                                    module.subItemList.push({label:$filter('translate')(childItem.title).replace('<br>', ''), code:childItem.name});
                                }
                            });
                            programs.push(module);
                        }
                    });
                    //console.log(programs);
                    return programs;
                }

            };
        }]);
});
